package com.hongying;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * channel.waitForConfirmsOrDie()批量确认模式
 */
public class SendWaitForConfirmsOrDie {
    public static void main(String[] args) {
        //创建连接工厂
        ConnectionFactory factory=new ConnectionFactory();
        //配置rabbitMQ的连接信息
        factory.setHost("192.168.174.129");
        factory.setPort(5672);
        factory.setUsername("root");
        factory.setPassword("123456");
        //定义连接
        Connection connection=null;
        //定义通道
        Channel channel=null;

        try {
            connection=factory.newConnection();
            channel=connection.createChannel();
            channel.queueDeclare("confirmQueue",true,false,false,null);
            channel.exchangeDeclare("directConfirmExchange","direct",true);
            channel.queueBind("confirmQueue","directConfirmExchange","confirmRoutingKey");
            String message="普通发送者确认模式的测试消息！";
            //启动发送者确认模式
            channel.confirmSelect();
            channel.basicPublish("directTransactionExchange","confirmRoutingKey",null,message.getBytes("utf-8"));
            /**
             * waitForConfirmsOrDie批量消息确认：它会同时向服务器中确认之前当前通道中发送的所有的消息是否已经全部成功写入
             * 这个方法没有任何返回值，如果服务器中有一条消息没有发送成功，服务器不可访问，都会被认为消息发送失败
             * 需要进行消息的补发，可以设置超时时间，超过这个时间也会抛出异常InterruptedException，确认失败，等待补发消息
             * 注意：
             * 批量消息确认速度比普通消息确认要快
             * 但是一旦出现消息补发情况，不能确认是哪条消息没有发送成功，需要对所有消息进行补发
             * 批量在实战中使用频率高
             */
            channel.waitForConfirmsOrDie();
            System.out.println("消息发送成功");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            if (channel!=null){
                try {
                    channel.close();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (TimeoutException e) {
                    e.printStackTrace();
                }
            }
            if (connection!=null){
                try {
                    connection.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }


    }
}